#pragma once
#include"_rbtree.hpp"

template<class K, class V>

class _map
{
	struct MapKeyofT
	{
		const K& operator()(const pair<K, V>& kv) {
			return kv.first;
		}
	};
public:
	typedef typename RBT<K, pair<const K, V>, MapKeyofT>::Iterator iterator;
	typedef typename RBT<K, pair<const K, V>, MapKeyofT>::Iterator const_iterator;

public:

	const_iterator begin()const {
		return _t.Begin();
	}

	const_iterator end() const {
		return _t.End();
	}

	iterator begin() {
		return _t.Begin();
	}
	iterator end()
	{
		return _t.End();
	}

	

public:

	void printset() {
		_t.InOrder();
	}

	
	pair<iterator,bool>insert(const pair<K, V>& key) {
		return _t.Insert(key);
	}

	iterator find(const pair<K, V>& key) {
		return _t.Find(key);
	}

	long long count() {
		return _t.Size();
	}

	long long max() {
		return _t.Max();
	}

	long long min() {
		return _t.Min();
	}

	_map() {};
	~_map() {};

private:
	RBT<K, pair<const K, V>, MapKeyofT> _t;
};